package ru.chaykin.quadtree;

import static ru.chaykin.rendering.CullingDataThread.GEO_BUFF_SIZE;
import java.util.ArrayList;
import java.util.List;

import ru.chaykin.primitives.Circle;

public class QuadTree {
	
	private static QuadElement root;
	private List<float[]> objsList; 
	private boolean listFull = false;
	
	public QuadTree(QuadElement root) {
		this.root = root;
		objsList = new ArrayList<float[]>(GEO_BUFF_SIZE);
	}
	
	public List<float[]> findObjects(Circle circle) {
		listFull = false;
		objsList.clear();
		findObjects(root, circle);
		return objsList;
	}
	
	private void findObjects(QuadElement quadEl, Circle circle) {
/*		if (listFull) 
			return;*/
		
		if (quadEl.getObjs() == null) { //Вероятно, содержит поддеревья, но может быть и пустым листом
			QuadElement[] quadEls = quadEl.getChildren();
			if (quadEls != null) { //Точно содержит поддеревья
				for (QuadElement el : quadEls) {
					if (el.getBoundingBox().in(circle))
						findObjects(el, circle);
				}
			}
		}
		else { //Нашли лист дерева
			List<float[]> leafObjs = quadEl.getObjs();
			synchronized(leafObjs) {
				for (float[] obj : leafObjs) {
					Circle leafCircle = new Circle(obj[0], obj[1], obj[2]);
					if (leafCircle.in(circle)) {
						objsList.add(obj);
				/*		if (objsList.size() >= GEO_BUFF_SIZE) {
							listFull = true;
							return;
						}*/
					}
				}
			}
		}
	}
}
